#pragma once
#include <pthread.h>
#include "Mutex.hpp"
using namespace MutexModule;
namespace CondModule
{
    /**
     * @brief 条件变量类，用于线程间的同步。
     *
     * 该类封装了POSIX条件变量，提供线程等待、通知和广播的功能。
     * 主要用于在线程需要等待某个条件成立时，避免忙等待，提高效率。
     *
     * 核心功能包括：
     * - 等待条件变量：Wait(Mutex &mutex)
     * - 通知单个等待线程：Signal()
     * - 通知所有等待线程：Broadcast()
     *
     * 使用示例：
     *
     * 构造函数：
     * - Cond()：初始化条件变量。
     *
     * 析构函数：
     * - ~Cond()：销毁条件变量。
     *
     * 注意事项：
     * - 使用Wait、Signal和Broadcast方法时，必须确保传入的Mutex对象已被正确初始化。
     * - 该类不负责Mutex对象的创建和销毁，需由用户自行管理。
     */
    class Cond
    {
    public:
        // 构造函数
        Cond()
        {
            // 初始化条件变量
            pthread_cond_init(&_cond, nullptr);
        }
        // 等待互斥锁
        void Wait(Mutex &mutex)
        {
            // 调用pthread_cond_wait函数等待条件变量
            int n = pthread_cond_wait(&_cond, mutex.Get());
            // 将返回值赋值给n，但并不使用
            (void)n;
        }
        // 发送信号，唤醒一个等待的线程
        void Signal()
        {
            // 调用pthread_cond_signal函数发送信号，唤醒一个等待的线程
            int n = pthread_cond_signal(&_cond);
            // 将返回值赋给n，但并不使用，因此使用(void)n来避免编译警告
            (void)n;
        }
        // 广播函数
        void Broadcast()
        {
            // 调用pthread_cond_broadcast函数，广播_cond条件变量
            int n = pthread_cond_broadcast(&_cond);
            // 将返回值赋给n，但并不使用
            (void)n;
        }
        // 析构函数，销毁条件变量
        ~Cond()
        {
            // 调用pthread_cond_destroy函数销毁条件变量
            pthread_cond_destroy(&_cond);
        }
    private:
        pthread_cond_t _cond;
    };
}  // namespace CondModule
